﻿/**************************************************************
 *
 * 唯一标识：32264b06-0498-4143-b0a3-85965b2d1a4e
 * 命名空间：Sgr.Generator.Snowflake
 * 创建时间：2024/6/21 14:34:03
 * 机器名称：DESKTOP-HJ4OAG9
 * 创建者：CocoYuan
 * 电子邮箱：fengqinhua2016@163.com
 * 描述：
 *
 *  Github: https://github.com/yitter/IdGenerator
 *
 *  IdGenerator 算法介绍
 *
 *  - 这是优化的雪花算法（雪花漂移），它生成的ID更短、速度更快
 *  - 支持 k8s 等容器环境自动扩容（自动注册 WorkerId），可在单机或分布式环境生成数字型唯一ID。
 *
 *  算法特点
 *
 *  - 整形数字，随时间单调递增（不一定连续），长度更短，用50年都不会超过 js Number类型最大值。（默认配置）
 *  - 速度更快，是传统雪花算法的2-5倍，0.1秒可生成50万个（基于8代低压i7）。
 *  - 支持时间回拨处理。比如服务器时间回拨1秒，本算法能自动适应生成临界时间的唯一ID。
 *  - 支持手工插入新ID。当业务需要在历史时间生成新ID时，用本算法的预留位能生成5000个每秒
 *  - 不依赖任何外部缓存和数据库。（k8s环境下自动注册 WorkerId 的动态库依赖 redis）
 *  - 基础功能，开箱即用，无需配置文件、数据库连接等。
 *  - 极致性能：500W/s~3000W/s。（所有测试数据均基于8代低压i7计算）
 *
 *  ID组成说明
 *
 *  - 第1部分，时间差，是生成ID时的系统时间减去 BaseTime 的总时间差（毫秒单位）
 *  - 第2部分，WorkerId，是区分不同机器或不同应用的唯一ID，最大值由 WorkerIdBitLength（默认6）限定
 *  - 第3部分，序列数，是每毫秒下的序列数，由参数中的 SeqBitLength（默认6）限定
 *
 *  参数设置
 *
 *  - WorkerIdBitLength，机器码位长，决定 WorkerId 的最大值，默认值6，取值范围 [1, 19]，实际上有些语言采用 无符号 ushort (uint16) 类型接收该参数，所以最大值是16，如果是采用 有符号 short (int16)，则最大值为15
 *  - WorkerId，机器码，最重要参数，无默认值，必须 全局唯一（或相同 DataCenterId 内唯一），必须 程序设定，缺省条件（WorkerIdBitLength取默认值）时最大值63，理论最大值 2^WorkerIdBitLength-1
 *  - SeqBitLength，序列数位长，决定序列数的最大值，默认值6，取值范围 [1, 19]
 *  - BaseTime，基准时间，从该时间开始算，一般取系统上线时间，由于时间差部分占41位，可用 69 年，所以一般不用设置
 *  - WorkerIdShift，WorkerId 左移位数，SeqBitLength 位数
 *  - TimestampShift，时间差左移位数，SeqBitLength + WorkerIdBitLength 位数
 *  - MaxSeqNumber，最大序列数，由 SeqBitLength 决定，最大值 2^SeqBitLength-1
 *  - MaxNextIdsNum，单次获取ID的最大个数，可用于批量获取ID，最大值 1000
 *
 *  最佳实践
 *
 *  1. 如果ID生成需求不超过5W个/s，不用修改任何配置参数
 *  2. 如果超过5W个/s，低于50W个/s，推荐修改：SeqBitLength=10
 *  3. 如果超过50W个/s，接近500W个/s，推荐修改：SeqBitLength=12
 *  PS: 增加 SeqBitLength 会让性能更高，但生成的 ID 会更长
 *
 *
 **************************************************************/

//using Microsoft.Extensions.Options;
//using System;
//using Yitter.IdGenerator;

//namespace Sgr.Generator.Snowflake
//{
//    public class YitterIdGenerator : INumberIdGenerator
//    {
//        private readonly IIdGenerator _idGenerator;

//        public YitterIdGenerator(IWorkIdRegister workIdRegister,
//            IOptions<IdGeneratorOptions> option)
//        {
//            IdGeneratorOptions options = option.Value;

//            if (options == null)
//                options = new IdGeneratorOptions();

//            if (options.WorkerIdBitLength < 6)
//                options.WorkerIdBitLength = 6;

//            workIdRegister.Register(options.WorkerId, 63);

//            _idGenerator = new DefaultIdGenerator(options);
//        }

//        public long GenerateUniqueId()
//        {
//            return _idGenerator.NewLong();
//        }
//    }
//}